package main

import (
	"net"
	"strings"
)

type User struct {
	Name string
	Addr string
	//每个用户都有一个对应的消息channel
	C    chan string
	conn net.Conn
	//新增一个server 句柄
	server *Server
}

func NewUser(conn net.Conn, server *Server) *User {
	userAddr := conn.RemoteAddr().String()
	user := &User{
		Name:   userAddr,
		Addr:   userAddr,
		C:      make(chan string),
		conn:   conn,
		server: server,
	}
	//启动监听Chanel
	go user.ListenMessage()
	return user
}

//监听user Message channel,有消息就推给客户端
func (s *User) ListenMessage() {
	for {
		msg := <-s.C
		s.conn.Write([]byte(msg + "\n"))
	}
}

//用户上线接口
func (s *User) Online() {
	s.server.mapLock.Lock()
	//用户上线，将其添加到OnlineMap中
	s.server.OnlineMap[s.Name] = s
	s.server.mapLock.Unlock()
	s.server.Broadcast(s, "已上线")
}

//用户离线接口
func (s *User) Offline() {
	s.server.mapLock.Lock()
	//用户下线，将其移除出OnlineMap
	delete(s.server.OnlineMap, s.Name)
	s.server.mapLock.Unlock()
	s.server.Broadcast(s, "已离线")
}

//用户发送消息接口
func (s *User) SendMsg(msg string) {
	//分析指令
	if msg == "ls" { //输出在线user,返回给当前输入指令的user
		s.server.mapLock.Lock()
		for _, user := range s.server.OnlineMap {
			userMsg := "[" + user.Addr + "]" + user.Name + ":在线..."
			s.conn.Write([]byte(userMsg + "\n"))
		}

		s.server.mapLock.Unlock()
	} else if len(msg) > 7 && msg[:7] == "rename|" {
		//修改名称
		newName := strings.Split(msg, "|")[1]
		//判断新名称是否存在
		if _, ok := s.server.OnlineMap[newName]; ok {
			s.conn.Write([]byte("当前修改的用户名已被占用\n"))
		} else {
			s.server.mapLock.Lock()
			//map 无法修改key,只能删掉重新加
			delete(s.server.OnlineMap, s.Name)
			s.server.OnlineMap[newName] = s
			s.server.mapLock.Unlock()

			s.Name = newName
			s.conn.Write([]byte("当前用户修改成功,name:" + s.Name + "\n"))
		}
	} else if len(msg) > 4 && msg[:3] == "to|" {
		//私聊功能，定义一个通信协议： to|张三｜消息
		//1、通过通信协议，获取对方的用户名
		remoteName := strings.Split(msg, "|")[1]
		if remoteName == "" { //格式有问题
			s.conn.Write([]byte("消息格式错误，请使用\"to|张三｜消息\"格式\n"))
		}
		//2、根据用户名，获取user对象
		if remoteUser, ok := s.server.OnlineMap[remoteName]; ok {
			//3、获取信息内容，通过user对象发送过去
			remoteMsg := strings.Split(msg, "|")[2]
			if remoteMsg == "" {
				s.conn.Write([]byte("无消息内容，请重发\n"))
				return
			}
			remoteUser.conn.Write([]byte(s.Name + "私聊您说：" + remoteMsg + "\n"))
		} else {
			s.conn.Write([]byte("私聊的用户不在线\n"))
		}

	} else {
		//将其广播即可
		s.server.Broadcast(s, msg)
	}
}
